/* *
* 发布订阅者模式也是一种行为型设计模式，它定义了一种一对多的依赖关系，使得多个订阅者对象可以同时监听某一个主题对象，当主题对象发生变化时，它会自动通知所有的订阅者对象，从而使它们能够及时进行响应。
* 与观察者模式不同的是，发布订阅者模式中包含一个事件中心（或称为消息中心、调度中心等），所有订阅者都将事件注册到该中心，当事件触发时，由事件中心通知所有订阅者进行处理。
* 发布订阅模式的这种中心化结构使得多个发布者和订阅者之间的关系更加灵活。
* */

class EventCenter {

    constructor() {
        this.eventList = {}
    }
    on(eventName,callback) {
        if (!this.eventList[eventName]) {
            this.eventList[eventName] = []
        }
        this.eventList[eventName].push(callback)
    }
    once(eventName,callback) {
        //? 存在 删了
        if (this.eventList[eventName].includes(callback)) {
            this.off(eventName,callback)
        }
        //? 再添加，那么就实现了只添加一次
        this.on(eventName,callback)
    }
    off(eventName,callback) {
        this.eventList[eventName] = this.eventList[eventName].filter((item) => {
            return item !== callback
        })
    }
    emit(eventName,...args) {
        this.eventList[eventName].forEach((event) => event.apply(this,args))

    }
}
function callback(arg) {
    console.log('callback',arg)
}
function callback2(arg1,arg2) {
    console.log('callback2:1',arg1)
    console.log('callback2:2',arg2)
}
function callback3(arg1,arg2) {
    console.log('callback3:1',arg1)
    console.log('callback3:2',arg2)
}
const sb = new EventCenter()
sb.on('test',callback)
sb.on('test',callback2)
sb.once('test',callback3)
//? 用once绑定 此项没有生效
sb.once('test',callback3)
sb.off('test',callback2)
sb.emit('test',1,2)


let p = {
    message: '',
    getMessage(msg){
        p[this.message] = msg
        console.log("p接收到消息", msg)
    }
}

sb.on('send2p', p.getMessage) // 订阅

sb.emit('send2p', '618大促销') // 发布
